//
//  BZAudioPlayer.h
//  BZFoundation
//
//  Created by 郭艺伟 on 2017/9/28.
//  Copyright © 2017年 郭艺伟. All rights reserved.
//

#import <Foundation/Foundation.h>



typedef NS_ENUM(NSInteger, BZAudioOutputType) {
    // 使用默认的输出，在插入耳机的情况下是耳机，否则是听筒
    BZAudioOutputTypeDefault,
    
    // 使用扬声器
    BZAudioOutputTypeSpeaker,
};

// typedef void (^MUPAudioBlock)();
// typedef void (^MUPAudioSuccessBlock)(bool success);

@class BZAudioPlayer;

@protocol BZAudioPlayerDelegate <NSObject>

@optional

/**
 *  当播放结束时被调用。
 *
 *  @param player      完成播放的 AudioPlayer
 *  @param flag        Yes 表示播放成功。No 表示由于解析音频数据错误，播放终止。
 */
- (void)audioPlayerDidFinishPlaying:(BZAudioPlayer *)player
                            success:(BOOL)success;

/**
 *  当中断发生时被调用，如来电。
 *
 *  @param playManager 当前正在使用的 AudioPlayer
 */
- (void)audioPlayerDidBeginInterruption:(BZAudioPlayer *)playManager;

/**
 *  当中断结束时被调用。
 *
 *  @param player      当前正在使用的 AudioPlayManager
 */
- (void)audioPlayerDidEndInterruption:(BZAudioPlayer *)player;

@end

@interface BZAudioPlayer : NSObject

/**
 *  如果正在播放，返回当前播放的时间点。单位为秒。
 */
@property (nonatomic, assign) NSTimeInterval currentTime;


/**
 *  当前关联的音频的总长度。单位为秒。如果为设置音频文件，返回 0。
 */
@property(nonatomic, readonly, assign) NSTimeInterval duration;


@property (nonatomic, weak) id<BZAudioPlayerDelegate> delegate;

/**
 *  返回一个 AudioPlayer 单例。
 *
 *  @return 一个 AudioPlayer 单例。
 */
+ (instancetype)sharedInstance;


/**
 *  切换音频输出模式。非特定需要不必指定。
 *
 *  @param type 输出模式。可选扬声器／听筒。
 */
- (BOOL)switchToOutputType:(BZAudioOutputType)type error:(NSError **)error;


/**
 *  设置当前准备播放的音频文件路径。只支持 Core Audio 允许的格式。
 *  如果在播放器正在播放时调用这个方法，播放会自动停止。
 *
 *  @param filePath 准备播放的文件路径
 *  @param error    发生错误时产生的 error
 *
 *  @return 设置是否成功
 */
- (BOOL)setURL:(NSURL *)filePath error:(NSError **)error;


/**
 *  开始或继续播放播放。播放前需先设置音频文件路径。
 *  如果耳机未插入，则以外放的形式播放。
 */
- (BOOL)play;


/**
 *  播放指定路径下的音频。只支持 Core Audio 允许的格式。
 *
 *  @param filePath 准备播放的文件路径
 *  @param error    发生错误时产生的 error
 */
- (BOOL)playAudioWithURL:(NSURL *)filePath error:(NSError **)error;

/**
 *  依据音频文件的时间线，从指定的时间点开始播放。
 *  播放前需先设置音频文件路径。
 *
 *  @param time 指定的时间点。
 */
- (void)playAtTime:(NSTimeInterval)time;

/**
 *  暂停播放。调用 play 恢复播放。
 */
- (void)pause;

/**
 *  是否正在播放
 *
 *  @return Yes 表示正在播放。反之不在。
 */
- (BOOL)isPlaying;

/**
 *  停止播放。
 */
- (void)stop;


@end
